package com.unitd.modules.sys.controller;

import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageInfo;
import com.unitd.comm.constant.ToolConstant;
import com.unitd.comm.web.BaseController;
import com.unitd.frame.comm.tree.Ztree;
import com.unitd.frame.comm.utils.BooleanUtils;
import com.unitd.frame.comm.utils.MapUtils;
import com.unitd.frame.comm.utils.StringUtils;
import com.unitd.frame.springweb.controller.result.AjaxResult;
import com.unitd.frame.sso.annotation.Action;
import com.unitd.frame.sso.annotation.Permission;
import com.unitd.modules.sys.entity.SysRole;
import com.unitd.modules.sys.entity.SysUser;
import com.unitd.modules.sys.entity.SysUserRole;
import com.unitd.modules.sys.service.ISysOrgService;
import com.unitd.modules.sys.service.ISysRoleService;
import com.unitd.modules.sys.service.ISysUserRoleService;
import com.unitd.modules.sys.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @desc 系统用户信息管理View端控制器类
 * @filename SysUserController.java
 * @copyright www.unitd.com
 * @author Hudan
 * @version 1.0
 * @date 2017-04-26
 */
@Controller
@RequestMapping("/sys/sysUser")
public class SysUserController extends BaseController {

	@Autowired
	private ISysUserService sysUserService;
	@Autowired
	private ISysOrgService sysOrgService;
	@Autowired
	private ISysRoleService sysRoleService;
	@Autowired
	private ISysUserRoleService sysUserRoleService;

	/**
	 * @desc 转到信息列表页
	 * @return 列表页地址
	 */
	@Permission("sys:sysUser:list")
	@RequestMapping("/list")
	public String toList(Model model) {
		// 取出有效的按照层级关系进行排序的树状结构列表
		List<Ztree> result =  sysOrgService.getSysOrgTrees();

		// 将组装后的树结构的表对象信息转换成json串
		model.addAttribute("orgs", JSON.toJSONString(result));
		model.addAttribute("orgNo", getSSOToken().getOrgNo()); 			// 默认为当前登录用户所在的机构
		return "/modules/sys/sysUser/list";
	}

	/**
	 * @desc 获取信息列表json数据, 方便列表页通过ajax获取并展示
	 * @param param 前端请求参数信息
	 * @return json数据
	 */
	@Permission("sys:sysUser:list")
	@RequestMapping("/listJson")
	@ResponseBody
	public String listJson(@RequestParam Map<String, Object> param) {

		// 获取分页数据信息
		Map<String, Integer> pageMap = getPageMap();

		// 转换页面查询参数为查询对象
		SysUser sysUser = new SysUser();
		MapUtils.toBean(param, sysUser);

		// 查询列表数据
		PageInfo<SysUser> pageData = sysUserService.getPageData(pageMap.get("pageNo"), pageMap.get("pageSize"), sysUser);
		return jsonPage(pageData);
	}

	/**
	 * @desc 根据主键ID获取详情信息, 并将获取的信息在详情页展示转到信息列表页
	 * @return 详情页地址及数据
	 */
	@Permission("sys:sysUser:view")
	@RequestMapping("/toView/{id}")
	public String toView(Model model, @PathVariable("id") String id) {
		SysUser sysUser = sysUserService.findBy(id);
		model.addAttribute("sysUser", sysUser);
		model.addAttribute("action", "doView");
		return "/modules/sys/sysUser/edit";
	}

	/**
	 * @desc 根据主键ID获取详情信息, 并将获取的信息在详情页展示转到信息列表页
	 * @return 详情页地址及数据
	 */
	@Permission("sys:sysUser:edit")
	@RequestMapping(value = "/toEdit/{id}")
	public String toEdit(Model model, @PathVariable("id") String id) {
		SysUser sysUser = sysUserService.findBy(id);
		model.addAttribute("sysUser", sysUser);
		return "/modules/sys/sysUser/edit";
	}

	/**
	 * @desc 处理详情信息的新增/修改操作
	 * @param model springMVC的数据模型对象
	 * @param sysUser 需要新增/修改的详情信息
	 * @param param 前端请求参数集合
	 * @return 操作结果
	 */
	@Permission("sys:sysUser:edit")
	@RequestMapping("/doEdit")
	@ResponseBody
	public AjaxResult doEdit(Model model, SysUser sysUser, @RequestParam Map<String, Object> param) {
		// 调用Hibernate-validate进行数据校验
		String validatMsg = beanValidator(model, sysUser);
		if(!StringUtils.isNull(validatMsg)) {
			return new AjaxResult(false, "处理数据失败![" +validatMsg+"]");
		}

		// 将数据存入Map对象,方便service使用
		param.put(SysUser.class.getName(), sysUser);
		param.put(ToolConstant.USER_TOKEN_ID, getSSOToken().getUid()); 						// 当前的登录用户主键
		param.put(ToolConstant.USER_TOKEN_NAME, getSSOToken().getUname()); 					// 当前的登录用户名

		// 调用service,处理数据保存
		sysUserService.doEdit(param);

		// 根据处理结果,反馈给前端
		return new AjaxResult(true);
	}

	/**
	 * @desc 根据主键ID, 删除对应的详情信息
	 * @param ids 需要删除的详情信息ID串,多个ID之间用,分割
	 * @return 删除结果
	 */
	@Permission("sys:sysUser:delete")
	@RequestMapping("/doDelete/{id}")
	@ResponseBody
	public AjaxResult doDelete(@PathVariable("id") String ids) {
		// 根据ID删除信息
		sysUserService.doDelete(ids);

		// 根据处理结果,反馈给前端
		return new AjaxResult(true);
	}

	/**
	 * @desc 转到选择已配置的数据表信息树的页面\
	 * @param model SpringMVC的数据模型对象
	 * @param param 请求参数
	 * @return String
	 */
	@Permission(action = Action.Skip)
	@RequestMapping("/toTree")
	public String toTree(Model model, @RequestParam Map<String, Object> param) {
		// 取出有效的按照层级关系进行排序的树状结构机构列表
		List<Ztree> result =  sysOrgService.getSysOrgTrees();
		// 将组装后的树结构的表对象信息转换成json串
		model.addAttribute("orgs", JSON.toJSONString(result));

		model.addAttribute("parentNo", param.get("orgNo"));
		return "/modules/sys/sysOrg/tree";
	}

	/**
	 * @desc 根据选择的机构编号,获取该机构下的用户的最大sort值并+1
	 * @param orgNo 请求参数 机构编号
	 * @return AjaxResult
	 */
	@Permission(action = Action.Skip)
	@RequestMapping("/getMaxSortByOrgNo/{orgNo}")
	@ResponseBody
	public AjaxResult getMaxSortByOrgNo(@PathVariable("orgNo") String orgNo) {
		Integer sort = sysUserService.getMaxSortByOrgNo(orgNo);

		return new AjaxResult(sort);
	}


	/**
	 * @desc 跳转到角色分配页面
	 * @param model MVC的数据模型对象
	 * @param id 用户ID
	 * @return String
	 */
	@Permission("sys:sysUser:allot")
	@RequestMapping("/allot/{id}")
	public String allot(Model model, @PathVariable("id") Long id) {
		model.addAttribute("userId", id);
		return "/modules/sys/sysUser/allot";
	}

	/**
	 * @desc 获取角色树
	 * @param userId 用户ID
	 * @return 角色权限树的json串
	 */
	@Permission("sys:sysUser:allot")
	@RequestMapping("/right")
	@ResponseBody
	public String right(@RequestParam(value = "userId") String userId) {
		// 获取所有的角色信息以及指定用户下的所有角色ID
		List<SysRole> sysRoles = sysRoleService.findAllData();
		List<String> roleRightList = sysUserRoleService.findRoleIdsByUserId(userId);

		// 将菜单的列表信息转换成树结构json
		List<Map<String, Object>> rightList = new ArrayList<>();
		for (SysRole sysRole : sysRoles) {
			Map<String, Object> map = new HashMap<>(5);
			map.put("id", String.valueOf(sysRole.getId()));
			map.put("pId", sysRole.getParentId());
			map.put("name", sysRole.getName());

			// 默认展开树
			map.put("open", "true");
			// 如果角色已有该权限，则默认选中
			if (roleRightList.contains(sysRole.getId())) {
				map.put("checked", "true");
			}
			rightList.add(map);
		}
		return JSON.toJSONString(rightList);
	}

	/**
	 * @desc 更新用户角色列表
	 * @param userId 用户ID
	 * @param roles 角色主键ID串,每个ID用,分割
	 * @return String
	 */
	@Permission("sys:sysUser:allot")
	@RequestMapping("allot")
	@ResponseBody
	public String allot( @RequestParam(value = "userId", required = false) String userId,
						 @RequestParam(value = "roles", required = false) String roles) {
		try {
			// 查询出本角色已经分配了的权限
			SysUserRole sysUserRole = new SysUserRole();
			sysUserRole.setUserId(userId);
			List<SysUserRole> userRoles = sysUserRoleService.listByBean(sysUserRole);

			// 如果存在角色，先进行删除
			if (userRoles.size() > 0) {
				for (SysUserRole rp : userRoles) {
					sysUserRoleService.deleteByPrimaryKey(rp.getId());
				}
			}

			// 添加新分配的角色
			String[] rightIds = roles.split(",");
			if (StringUtils.isNotBlank(roles)) {
				// 添加新分配的权限
				List<SysUserRole> sysUserRoles = new ArrayList<>();
				List<String> roleList = new ArrayList<>();
				SysUserRole roleMenu;
				for (String pid : rightIds) {
					roleMenu = new SysUserRole();
					roleMenu.setUserId(userId);
					roleMenu.setRoleId(pid);

					roleList.add(pid);
					sysUserRoles.add(roleMenu);
				}
				sysUserRoleService.batchInsertSelective(sysUserRoles);
			}
			return BooleanUtils.toString(true);
		} catch (Exception e) {
			return BooleanUtils.toString(false);
		}
	}

	/**
	 * @desc 设置用户头像
	 * @return String
	 */
	@Permission("sys:sysUser:edit")
	@RequestMapping(value = "/setAvatar", method = RequestMethod.GET)
	public String setAvatar() {
		return "/modules/sys/sysUser/avatar";
	}
}